

********************************************************************** 
* File: DelayUs.asm                                                  * 
* Devices: TMS320F2808, TMS320F2806, TMS320F2801                     * 
* Author: David M. Alter, Texas Instruments Inc.                     * 
* History:                                                           * 
*   11/13/05 - added save/restore of ST1 to preserve EALLOW setting  * 
*              (D. Alter)                                            * 
*   05/02/05 - added watchdog servicing in outer loop (D. Alter)     * 
*   02/11/05 - original (D. Alter)                                   * 
********************************************************************** 
 
WDKEY	.set	0x7025 
 
********************************************************************** 
* Function: DelayUs()                                                * 
* Description: Implements a time delay.                              * 
* DSP: TMS320F2808, TMS320F2806, TMS320F2801                         * 
* Last Modified: 05/02/05                                            * 
* Include files: none                                                * 
* Function Prototype: void DelayUs(unsigned int)                     * 
* Useage: DelayUs(Usec);                                             * 
* Input Parameters: unsigned int Usec = time delay in microseconds   * 
* Return Value: none                                                 * 
* Notes:                                                             * 
*   1) The execution time of this routine is based upon a 100 MHz    * 
*      CPUCLK.  It also assumes that the function executes out of    * 
*      internal RAM.  If executing out of internal flash, the        * 
*      execution speed will be slightly slower.  However, the inner  * 
*      loop of this function is essentially invariant to the memory  * 
*      it is running in.  Therefore, even when running in flash      * 
*      memory, the basic loop time will be only slightly longer than * 
*      1 us.                                                         * 
*                                                                    * 
*   2) The outer loop of this function is interruptible (i.e., every * 
*      1 us).  The user should disable interrupts before calling the * 
*      function if they need an exact delay time, as opposed to a    * 
*      minimum delay time.                                           * 
*                                                                    * 
********************************************************************** 
       .def _DelayUs 
       .text 
 
_DelayUs: 
        MOVB AH, #0                   ;Zero AH 
        PUSH ST1                      ;Save ST1 to preserve EALLOW setting 
 
DelayUs1:                             ;Outer loop 
 
;Service the watchdog in case it is active 
        EALLOW 
        MOVZ DP, #(WDKEY>>6) 
        MOV @WDKEY, #0x0055 
        MOV @WDKEY, #0x00AA 
        EDIS 
 
;Proceed with the inner loop 
        RPT #88                       ;Inner loop 
     || NOP 
 
        SUBB ACC,#1                   ;Decrement outer loop counter 
        BF DelayUs1, GT               ;Branch for outer loop 
 
;Finish up 
        POP ST1                       ;Restore ST1 
        LRETR                         ;Return 
 
;end of function DelayUs() ****************************************** 
 
 
;end of file DelayUs.asm 
       .end 
